package com.itheima.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

public class JwtUtil {

    private static String secret = "itcast"; // 应该存储在一个安全的地方
    private static long jwtExpirationInMs = 86400000; // 设置过期时间为24小时

    /**
     * 创建JWT令牌
     * @param id
     * @return
     */
    public static String generateToken(Integer id) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",id);
        return createToken(claims);
    }

    /**
     * 解析JWT令牌
     * @param token
     * @return
     */
    public static Claims parseJwt(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }

    /**
     * 根据token获取用户名
     * @param token
     * @return
     */
     private static String getUsernameFromToken(String token) {
        return getClaimFromToken(token, Claims::getSubject);
    }

    /**
     * 检查token是否过期
     * @param token
     * @return
     */
    private static Boolean isTokenExpired(String token) {
        final Date expiration = getClaimFromToken(token, Claims::getExpiration);
        return expiration.before(new Date());
    }

    /**
     * 内部方法：创建令牌
     * @param claims
     * @return
     */
    private static String createToken(Map<String, Object> claims) {
        return Jwts.builder()
                .addClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + jwtExpirationInMs))
                .signWith(SignatureAlgorithm.HS256, secret).compact();
    }

    /**
     * 内部方法：从token中提取单一声明
     * @param token
     * @param claimsResolver
     * @return
     * @param <T>
     */
    private static <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = parseJwt(token);
        return claimsResolver.apply(claims);
    }
}